package 中等.双指针;

/**
 * 给你一个整数 total ，表示你拥有的总钱数。同时给你两个整数
 * cost1 和 cost2 ，分别表示一支钢笔和一支铅笔的价格。你可
 * 以花费你部分或者全部的钱，去买任意数目的两种笔。
 * 请你返回购买钢笔和铅笔的 不同方案数目 。
 */
public class 买钢笔和铅笔的方案数_2240 {

    public static void main(String[] args) {

    }

    /**
     * 双指针枚举
     * 将 cost1 购买数量 cnt1 从 0 到大枚举
     * 将 cost2 购买数量 cnt2 从 total/cost2 到 0 枚举
     * 当 cnt1 变大时，cnt2 要变小，当 cnt1 * cost1 + cnt2 * cost2 <= total
     * 时，有 cnt2+1 种方案，+1 是因为 cnt2=0 也是一种方案
     */
    public long waysToBuyPensPencils(int total, int cost1, int cost2) {
        long ans = 0;
        int cnt1 = 0, cnt2 = total / cost2;

        while (cnt1 * cost1 <= total) {
            while (cnt1 * cost1 + cnt2 * cost2 > total) {
                cnt2--;
            }

            ans += cnt2 + 1;
            cnt1++;
        }

        return ans;
    }

}
